package Servlets;

import CalendarioDAOS.CalendarioDAO;
import CalendarioDAOS.RegistrosDiaDAO;
import CalendarioDTOS.RegistrosDiaDTO;
import Estructuras.Principales.PrincipalCalendario;
import Herramientas.RedireccionPOPUP;
import SistemaDTOS.UsersDTO;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.Calendar;
import java.util.GregorianCalendar;
import java.util.Vector;
import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

/**
 *
 * @author Alan Gonzalez
 */
@WebServlet(name = "Calendario", urlPatterns = {"/Calendario"})
public class Calendario extends HttpServlet {

    /**
     * Processes requests for both HTTP <code>GET</code> and <code>POST</code>
     * methods.
     *
     * @param request servlet request
     * @param response servlet response
     * @throws ServletException if a servlet-specific error occurs
     * @throws IOException if an I/O error occurs
     */
    protected void processRequest(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        response.setContentType("text/html;charset=UTF-8");
        PrintWriter out = response.getWriter();
        try {

            HttpSession session = request.getSession();
            Vector errores = new Vector();

            String action = new String();
            action = request.getParameter("action");
            UsersDTO usuarioLogeado = (UsersDTO) session.getAttribute("userUpDTO");
            System.out.println("id del usuario logeado : " + usuarioLogeado.getId());

            if (action.equals("principal")) {

                PrincipalCalendario calendarioPrincipal = new PrincipalCalendario();
                calendarioPrincipal.setUsuarioLogeado(usuarioLogeado);

                Calendar calendario = new GregorianCalendar();
                CalendarioDAO calendarioDAO = new CalendarioDAO();

                int anioJava = calendario.get(Calendar.YEAR); // anio actual del sistema
                int mesJava = calendario.get(Calendar.MONTH);

                Vector vMesesAnio = new Vector();
                vMesesAnio = calendarioDAO.calendarioAnual(anioJava, usuarioLogeado);
                calendarioPrincipal.setMeses(vMesesAnio);
                calendarioPrincipal.setAnioApuntador(anioJava);// año apuntador

                session.setAttribute("principalCalendario", calendarioPrincipal);
                RequestDispatcher d = request.getRequestDispatcher("CalendariosJSP/anual.jsp");
                d.forward(request, response);

            } else if (action.equals("eventsDay")) {
                errores.clear();
                PrincipalCalendario principal = (PrincipalCalendario) session.getAttribute("principalCalendario");
                principal.setErrores(errores);
                RegistrosDiaDAO registrosDAO = new RegistrosDiaDAO();
                String date = request.getParameter("date");
                principal.setFechaApuntador(date);
                Vector eventosDia = registrosDAO.registrosDia(usuarioLogeado.getId(), date);
                principal.setEventosDia(eventosDia);
                session.setAttribute("principalCalendario", principal);
                RequestDispatcher d = request.getRequestDispatcher("CalendariosJSP/nuevoEvento.jsp");
                d.forward(request, response);

            } else if (action.equals("addEvent")) {

                errores.clear();
                int index = Integer.parseInt(request.getParameter("index"));

                PrincipalCalendario principal = (PrincipalCalendario) session.getAttribute("principalCalendario");
                principal.setErrores(errores);
                RegistrosDiaDAO registrosDAO = new RegistrosDiaDAO();

                switch (index) {
                    case 1:
                        // RECUPERA DATOS DEL FORM
                        String horaInicio = request.getParameter("horaInicio");
                        String horaFin = request.getParameter("horaFin");
                        String descripcion = request.getParameter("descripcion");
                        String date = request.getParameter("date");

                        RegistrosDiaDTO regDiaDTO = new RegistrosDiaDTO();

                        int horaInicioInt = 0;
                        int horaFinInt = 0;

                        if (horaInicio.equals("Selecione Hora Inicio")) {
                            errores.add("Seleccione Una Hora de Unicio Al Evento");
                        } else {
                            regDiaDTO.setHoraEventoInicio(horaInicio);
                            horaInicioInt = Integer.parseInt(horaInicio.toString());
                        }

                        if (horaFin.equals("Selecione Hora Fin")) {
                            errores.add("Seleccione Una Hora de Fin Al Evento");
                        } else {
                            regDiaDTO.setHoraEventoFin(horaFin);
                            horaFinInt = Integer.parseInt(horaFin.toString());
                        }

                        if (descripcion.length() > 0) {
                            regDiaDTO.setDescripcion(descripcion);
                        } else {
                            errores.add("Ingrese Una Descripcion al Evento nuevo");
                        }

                        if (horaInicioInt == horaFinInt) {
                            errores.add("La Hora de Inicio y Fin No Deben Ser Identicas");
                        }

                        if (horaInicioInt > horaFinInt) {
                            errores.add("La Hora de Inicio No Deben Ser Mas Tarde Que la Hora de Fin");
                        }

                        regDiaDTO.setFechaEvento(date);
                        regDiaDTO.setUserId(usuarioLogeado.getId());

                        if (errores.size() > 0) {
                            principal.setErrores(errores);
                            session.setAttribute("principalCalendario", principal);
                            RequestDispatcher d = request.getRequestDispatcher("CalendariosJSP/nuevoEvento.jsp");
                            d.forward(request, response);

                        } else if (errores.size() == 0) {
                            // se busca si hay registros en la tabla 
                            int eventosDia = registrosDAO.cuentaRegistrosDia(usuarioLogeado.getId(), date);

                            if (eventosDia == 0) {
                                registrosDAO.insertarRegistro(regDiaDTO);
                                RedireccionPOPUP redireccion = new RedireccionPOPUP();
                                redireccion.setServicio("Calendario?action=principal");
                                session.setAttribute("sistema", redireccion);
                                RequestDispatcher d = request.getRequestDispatcher("loading.jsp");
                                d.forward(request, response);

                            } else if (eventosDia > 0) {
                                int horaFinUltimoEvento = registrosDAO.ultimoEventoFin(usuarioLogeado.getId(), date);
                                if (horaInicioInt == horaFinUltimoEvento) {
                                    registrosDAO.insertarRegistro(regDiaDTO);
                                    //======= redireccion pop up =======//
                                    RedireccionPOPUP redireccion = new RedireccionPOPUP();
                                    redireccion.setServicio("Calendario?action=principal");
                                    session.setAttribute("sistema", redireccion);
                                    //======= redireccion pop up =======// 
                                    RequestDispatcher d = request.getRequestDispatcher("loading.jsp");
                                    d.forward(request, response);

                                } else if (horaInicioInt > horaFinUltimoEvento) {
                                    errores.add("No puede deja libres horas Entre eventos");
                                    RequestDispatcher d = request.getRequestDispatcher("CalendariosJSP/nuevoEvento.jsp");
                                    d.forward(request, response);

                                } else if (horaInicioInt < horaFinUltimoEvento) {
                                    errores.add("Ya existe un Evento dentro de ese horario");
                                    RequestDispatcher d = request.getRequestDispatcher("CalendariosJSP/nuevoEvento.jsp");
                                    d.forward(request, response);
                                }

                            }
                        }
                        break;
                }
            }
        } finally {
            out.close();
        }
    }

    // <editor-fold defaultstate="collapsed" desc="HttpServlet methods. Click on the + sign on the left to edit the code.">
    /**
     * Handles the HTTP <code>GET</code> method.
     *
     * @param request servlet request
     * @param response servlet response
     * @throws ServletException if a servlet-specific error occurs
     * @throws IOException if an I/O error occurs
     */
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        processRequest(request, response);
    }

    /**
     * Handles the HTTP <code>POST</code> method.
     *
     * @param request servlet request
     * @param response servlet response
     * @throws ServletException if a servlet-specific error occurs
     * @throws IOException if an I/O error occurs
     */
    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        processRequest(request, response);
    }

    /**
     * Returns a short description of the servlet.
     *
     * @return a String containing servlet description
     */
    @Override
    public String getServletInfo() {
        return "Short description";
    }// </editor-fold>c

}
